package com.young.springbootredisson.config;

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * redisson配置，通过手动编码的方式来进行配置（也可以通过@Value注解读取springboot的配置文件获取相应的配置，然后再进行手动编码配置，
 * 本项目中并没有这种配置的案例，如果需要可以自己实现）
 *
 * 注意：在本项目中默认并不是采用这种方式进行配置的，而是使用springboot 自动配置来实现的，
 *      该实现方式由redisson官方提供的org.redisson.spring.starter.RedissonAutoConfiguration 类来完成
 */
//@Configuration
public class RedissonConfig {

    /**
     * RedissonClient 单机模式配置
     *
     * @return redissonClient
     */
    @Bean
    public RedissonClient singleConfig() {
        // connects to 127.0.0.1:6379 by default
        //RedissonClient redisson = Redisson.create();

        Config config = new Config();
        config.useSingleServer().setAddress("redis://myredisserver:6379");
        RedissonClient redisson = Redisson.create(config);
        return redisson;
    }

    /**
     * RedissonClient 哨兵模式配置
     *
     * @return redissonClient
     */
    @Bean
    public RedissonClient sentinelConfig() {
        Config config = new Config();
        config.useSentinelServers()
                .setMasterName("mymaster")
                // use "rediss://" for SSL connection
                .addSentinelAddress("redis://127.0.0.1:26389", "redis://127.0.0.1:26379")
                .addSentinelAddress("redis://127.0.0.1:26319");

        RedissonClient redisson = Redisson.create(config);
        return redisson;
    }

    /**
     * RedissonClient 集群模式配置
     *
     * @return redissonClient
     */
    @Bean
    public RedissonClient clusterConfig() {
        Config config = new Config();
        config.useClusterServers()
                .setScanInterval(2000) // cluster state scan interval in milliseconds
                // use "rediss://" for SSL connection
                .addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001")
                .addNodeAddress("redis://127.0.0.1:7002");

        RedissonClient redisson = Redisson.create(config);
        return redisson;
    }

    /**
     * RedissonClient 复制模式配置
     *
     * @return redissonClient
     */
    @Bean
    public RedissonClient replicatedConfig() {
        Config config = new Config();
        config.useReplicatedServers()
                .setScanInterval(2000) // master node change scan interval
                // use "rediss://" for SSL connection
                .addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001")
                .addNodeAddress("redis://127.0.0.1:7002");

        RedissonClient redisson = Redisson.create(config);

        return redisson;
    }

    /**
     * RedissonClient 主从模式配置
     *
     * @return redissonClient
     */
    @Bean
    public RedissonClient masterSlaveConfig() {
        Config config = new Config();
        config.useMasterSlaveServers()
                // use "rediss://" for SSL connection
                .setMasterAddress("redis://127.0.0.1:6379")
                .addSlaveAddress("redis://127.0.0.1:6389", "redis://127.0.0.1:6332", "redis://127.0.0.1:6419")
                .addSlaveAddress("redis://127.0.0.1:6399");

        RedissonClient redisson = Redisson.create(config);
        return redisson;
    }

    // 根据官方问题并没有找到对应的方法，待探索


    /**
     * RedissonClient 代理模式配置
     * 根据redisson github官网文档进行配置的，但是实际在这个版本里面没有 useProxyServers() 方法，待探索
     * @return redissonClient
     */
//    @Bean
//    public RedissonClient proxyConfig() {
//        Config config = new Config();
//
//        // use "rediss://" for SSL connection
//        config.useProxyServers().addAddress("redis://myredisserver1:6379", "redis://myredisserver2:6379");
//
//        RedissonClient redisson = Redisson.create(config);
//        return redisson;
//    }
}
